package com.ruoyi.common.core.domain.model;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.ruoyi.common.core.domain.entity.H5User;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.io.Serializable;
import java.util.Collection;
import java.util.Collections;

/**
 * H5用户登录信息封装类
 * 实现Spring Security的UserDetails接口，扩展Token缓存所需字段
 */
public class H5LoginUser implements UserDetails, Serializable {

    private static final long serialVersionUID = 3091288257971480727L;
    /** H5用户实体信息 */
    private H5User h5User;

    /** Token唯一标识（用于缓存键） */
    private String token;

    /** 登录时间（毫秒时间戳） */
    private Long loginTime;

    /** 过期时间（毫秒时间戳） */
    private Long expireTime;

    /** 登录IP地址 */
    private String ipaddr;

    /** 登录地点 */
    private String loginLocation;

    /** 浏览器类型 */
    private String browser;

    /** 操作系统 */
    private String os;

    /** 设备类型（MOBILE/PC，H5特有） */
    private String device;


    // 构造方法：接收H5用户实体
    public H5LoginUser(H5User h5User) {
        this.h5User = h5User;
    }


    /**
     * 获取用户权限集合（H5用户默认角色）
     */
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        // 可根据实际业务扩展权限（如不同H5用户角色）
        return Collections.singletonList(new SimpleGrantedAuthority("ROLE_H5"));
    }

    /**
     * 获取用户密码（用于Spring Security认证）
     */
    @JsonIgnore
    @Override
    public String getPassword() {
        return h5User.getPassword();
    }

    /**
     * 获取用户名（用于Spring Security认证）
     */
    @Override
    public String getUsername() {
        return h5User.getUserName();
    }

    /**
     * 账户是否未过期
     */
    @Override
    public boolean isAccountNonExpired() {
        return true; // 可根据业务实现（如会员有效期）
    }

    /**
     * 账户是否未锁定
     */
    @Override
    public boolean isAccountNonLocked() {
        // 状态为"1"表示停用（锁定）
        return !"1".equals(h5User.getStatus());
    }

    /**
     * 密码是否未过期
     */
    @Override
    public boolean isCredentialsNonExpired() {
        return true; // 可根据密码过期策略实现
    }

    /**
     * 账户是否启用
     */
    @Override
    public boolean isEnabled() {
        // 状态为"0"（正常）或"2"（未验证手机号）视为启用
        return "0".equals(h5User.getStatus()) || "2".equals(h5User.getStatus());
    }


    // ------------------------------ 自定义getter/setter ------------------------------

    public H5User getH5User() {
        return h5User;
    }

    public void setH5User(H5User h5User) {
        this.h5User = h5User;
    }

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }

    public Long getLoginTime() {
        return loginTime;
    }

    public void setLoginTime(Long loginTime) {
        this.loginTime = loginTime;
    }

    public Long getExpireTime() {
        return expireTime;
    }

    public void setExpireTime(Long expireTime) {
        this.expireTime = expireTime;
    }

    public String getIpaddr() {
        return ipaddr;
    }

    public void setIpaddr(String ipaddr) {
        this.ipaddr = ipaddr;
    }

    public String getLoginLocation() {
        return loginLocation;
    }

    public void setLoginLocation(String loginLocation) {
        this.loginLocation = loginLocation;
    }

    public String getBrowser() {
        return browser;
    }

    public void setBrowser(String browser) {
        this.browser = browser;
    }

    public String getOs() {
        return os;
    }

    public void setOs(String os) {
        this.os = os;
    }

    public String getDevice() {
        return device;
    }

    public void setDevice(String device) {
        this.device = device;
    }

    /**
     * 获取用户ID（快捷方法）
     */
    public Long getUserId() {
        return h5User.getUserId();
    }

    /**
     * 获取用户手机号（快捷方法，H5常用）
     */
    public String getPhonenumber() {
        return h5User.getPhonenumber();
    }
}